
def chinese_to_arabic(chinese_num: str) -> int:
    # 基础数字映射
    char_map = {
        '零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
        '六': 6, '七': 7, '八': 8, '九': 9
    }
    # 单位映射（含常用异体字）
    unit_map = {
        '十': 10, '百': 100, '千': 1000,
        '万': 10000, '亿': 100000000,
        '拾': 10, '佰': 100, '仟': 1000  # 财务大写支持
    }

    total = 0      # 最终结果
    current = 0    # 当前小节累加值（如“三百”的3 * 100）
    section = 0    # 当前大节值（用于处理万/亿）
    last_unit = 0  # 记录上一个单位值（用于零的规则）

    for char in chinese_num:
        if char in char_map:
            num = char_map[char]
            current = num
            last_unit = 0  # 数字后重置单位标记
        elif char in unit_map:
            unit = unit_map[char]
            # 处理“十”开头的省略（如“十五”）
            if unit == 10 and current == 0:
                current = 1

            # 大单位（万/亿）：结算当前大节
            if unit >= 10000:
                section = (section + current) * unit
                total = section
                section = 0  # 重置大节
            # 小单位（十/百/千）：累加当前小节
            else:
                if current == 0:  # 处理“一千零三”
                    current = 1
                current *= unit
                section += current

            current = 0
            last_unit = unit  # 记录单位用于零规则
        else:
            raise ValueError(f"无效字符: {char}")

    # 处理结尾无单位的情况（如“一百五”）
    if last_unit < 10:  # 上个字符是数字
        section += current

    return total + section
